package Offer45;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

/**
 * @author 23737
 * @time 20219.17
 * 把数组排成最小的数:
 * 输入一个非负整数数组，把数组里所有数字拼接起来排成一个数，打印能拼接出的所有数字中最小的一个。
 */
public class Test {
    public static void main(String[] args) {
        int[] ints = new int[]{3,10,2};
        System.out.println(new Solution().minNumber(ints));
    }
}

/*借助大佬的思想，然后自己实现的解法：使用Arrays.sort进行排序*/
class Solution {
    public String minNumber(int[] nums) {
        String[] strings = new String[nums.length];
        //首先将数组中的元素用String的数组进行一个存储
        for (int i = 0; i < nums.length; i++) {
            strings[i] = String.valueOf(nums[i]);
        }
        //然后这里借助比较器来实现排序，使得相邻的两个元素是组合下来最小的
        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o1+o2).compareTo(o2+o1);
            }
        });
        //再使用StringBuffer来进行字符串的存储
        StringBuffer stringBuffer = new StringBuffer();
        for (String s : strings
                ) {
            stringBuffer.append(s);
        }
        //最后返回就好了
        return stringBuffer.toString();
    }

    /**
     * 二刷
     * @param nums
     * @return
     */
    public String minNumber2(int[] nums) {
        String[] s = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            s[i] = String.valueOf(nums[i]);
        }
        Arrays.sort(s, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o1+o2).compareTo(o2+o1);
            }
        });
        StringBuilder stringBuilder = new StringBuilder();
        for (String s1 : s) {
            stringBuilder.append(s1);
        }
        return stringBuilder.toString();
    }
}

//这种解法和上面那种解法是一样的
class SolutionTwo {
    public String minNumber(int[] nums) {
        List<String> list = new ArrayList<>();
        for (int num : nums) {
            list.add(String.valueOf(num));
        }
        list.sort((o1, o2) -> (o1 + o2).compareTo(o2 + o1));
        return String.join("", list);
    }
}



